package com.xj.config;

import com.xj.aop.LogAspects;
import com.xj.aop.MathCalculator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * AOP: 动态代理
 *  程序运行期间动态的将某段代码切入到制定方法制定位置进行运行的变成方式；
 * 1、导入aop模块；Spring AOP：（spring-aspects）
 * 2、定义一个业务逻辑类（MathCalculator）；在业务逻辑运行的时候讲日志进行打印（方法之前，之后，发生异常，xxx）
 * 3、定义一个日志切面类（LogAspects）：切面类里面的方法需要动态感知MathCalculator.div
 *      通知方法：
 *          前置通知：@Before
 *          后置通知：@After
 *          返回通知：@AfterReturning
 *          异常通知：@AfterThrowing
 *          环绕通知：动态代理，手动推进目标方法的运行 @Around（joinPoint.procced()）
 *
 * 4、给切面类的目标方法标注何时何地运行（通知注解）
 * 5、将切面类和业务逻辑类都加入到容器中
 * 6、告诉spring那个类是切面类（@Aspect）
 * 7、开启aop@EnableAspectJAutoProxy
 *      Spring中有很多的@Enablexxx
 *
 * 三步：
 *  1、切面类和调用组件加入容器
 *  2、声明通知
 *  3、开启基于注解的aop模式（@EnableAspectJAutoProxy）
 *
 * AOP原理
 *      @EnableAspectJAutoProxy:
 *      1@EnableAspectJAutoProxy是什么
 *          1、@Import(AspectJAutoProxyRegistrar.class)：给容器中导入AspectJAutoProxyRegistrar
 *              利用AspectJAutoProxyRegistrar自定义给容器中注册bean；
 *
 *
 * @author xujiang
 * @date 2021/2/17 17:28
 */
@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {

    @Bean
    public MathCalculator mathCalculator() {
        return new MathCalculator();
    }

    @Bean
    public LogAspects logAspects() {
        return new LogAspects();
    }

}
